home *** CD-ROM | disk | FTP | other *** search
- /* UDP header conversion routines
- * Copyright 1991 Phil Karn, KA9Q
- */
- #include "global.h"
- #include "mbuf.h"
- #include "ip.h"
- #include "internet.h"
- #include "udp.h"
-
- /* Convert UDP header in internal format to an mbuf in external format */
- struct mbuf *
- htonudp(udp,bp,ph)
- struct udp *udp;
- struct mbuf *bp;
- struct pseudo_header *ph;
- {
- register char *cp;
- int16 checksum;
-
- /* Allocate UDP protocol header and fill it in */
- bp = pushdown(bp,UDPHDR);
- cp = bp->data;
- cp = put16(cp,udp->source); /* Source port */
- cp = put16(cp,udp->dest); /* Destination port */
- cp = put16(cp,udp->length); /* Length */
- *cp++ = 0; /* Clear checksum */
- *cp-- = 0;
-
- /* All zeros and all ones is equivalent in one's complement arithmetic;
- * the spec requires us to change zeros into ones to distinguish an
- * all-zero checksum from no checksum at all
- */
- if((checksum = cksum(ph,bp,ph->length)) == 0)
- checksum = 0xffffffff;
- put16(cp,checksum);
- return bp;
- }
- /* Convert UDP header in mbuf to internal structure */
- int
- ntohudp(udp,bpp)
- struct udp *udp;
- struct mbuf **bpp;
- {
- char udpbuf[UDPHDR];
-
- if(pullup(bpp,udpbuf,UDPHDR) != UDPHDR)
- return -1;
- udp->source = get16(&udpbuf[0]);
- udp->dest = get16(&udpbuf[2]);
- udp->length = get16(&udpbuf[4]);
- udp->checksum = get16(&udpbuf[6]);
- return 0;
- }
- /* Extract UDP checksum value from a network-format header without
- * disturbing the header
- */
- int16
- udpcksum(bp)
- struct mbuf *bp;
- {
- struct mbuf *dup;
-
- if(dup_p(&dup,bp,6,2) != 2)
- return 0;
- return pull16(&dup);
- }
-
-